USE [QuanLyRapPhim]
GO
-- =============================================
-- Author:		DatNgo
-- Description: Thêm một phim vào bảng Phim
-- =============================================
IF OBJECT_ID('sp_ThemPhim', 'P') IS NOT NULL
DROP PROC sp_ThemPhim
GO
CREATE PROCEDURE sp_ThemPhim
	@tenPhim nvarchar(100),
	@daoDien nvarchar(100),
	@NamSX int,
	@theLoai nvarchar(100),
	@nuoc nvarchar(50)
AS
BEGIN
	INSERT INTO Phim(TenPhim,DaoDien,NamSX,TheLoai,Nuoc) VALUES(@tenPhim,@daoDien,@NamSX,@theLoai,@nuoc)
	RETURN SCOPE_IDENTITY()
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Sửa thông tin phim
-- =============================================
IF OBJECT_ID('sp_CapNhatPhim', 'P') IS NOT NULL
DROP PROC sp_CapNhatPhim
GO
CREATE PROCEDURE sp_CapNhatPhim
	@maPhim int,
	@tenPhim nvarchar(100),
	@daoDien nvarchar(100),
	@NamSX int,
	@theLoai nvarchar(100),
	@nuoc nvarchar(50)
AS
BEGIN
BEGIN TRAN
	UPDATE Phim
	SET TenPhim = @tenPhim, DaoDien = @daoDien, NamSX = @NamSX, TheLoai = @theLoai, Nuoc = @nuoc
	WHERE MaPhim = @maPhim
COMMIT TRAN
RETURN 1
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Xóa phim
-- =============================================
IF OBJECT_ID('sp_XoaPhim', 'P') IS NOT NULL
DROP PROC sp_XoaPhim
GO
CREATE PROCEDURE sp_XoaPhim
	@maPhim int
AS
BEGIN
BEGIN TRAN
	IF EXISTS(SELECT 1 FROM SuatChieu WHERE MaPhim=@maPhim)
	BEGIN
		print N'Phim đã có suất chiếu, không thể xóa.'
		ROLLBACK TRAN
		RETURN
	END
	WAITFOR DELAY '0:0:10'

	BEGIN TRY
		DELETE FROM Phim WHERE MaPhim=@maPhim
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH
	PRINT N'Đã xóa phim'
COMMIT TRAN
RETURN 1
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Xóa thời gian chiếu phim
-- =============================================
IF OBJECT_ID('sp_XoaThoiGian', 'P') IS NOT NULL
DROP PROC sp_XoaThoiGian
GO
CREATE PROCEDURE sp_XoaThoiGian
	@maThoiGian int
AS
BEGIN
BEGIN TRAN
	IF EXISTS(SELECT 1 FROM SuatChieu WHERE MaThoiGianChieu=@maThoiGian)
	BEGIN
		print N'Thời gian này đã có suất chiếu, không thể xóa.'
		ROLLBACK TRAN
		RETURN
	END

	BEGIN TRY
		DELETE FROM ThoiGianChieu WHERE MaThoiGianChieu=@maThoiGian
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH
	PRINT N'Đã xóa thời gian'
COMMIT TRAN
RETURN 1
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Thêm một suất chiếu cho phim
-- =============================================
IF OBJECT_ID('sp_ThemSuatChieu', 'P') IS NOT NULL
DROP PROC sp_ThemSuatChieu
GO
CREATE PROCEDURE sp_ThemSuatChieu
	@maPhim int,
	@maPhong int,
	@thoiGian time,
	@ngay date
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM Phim WHERE MaPhim=@maPhim) OR NOT EXISTS(SELECT 1 FROM PhongChieu WHERE MaPhongChieu=@maPhong)
	BEGIN
		print N'Phim hoặc phòng chiếu ko tồn tại'
		ROLLBACK TRAN
		RETURN
	END

	WAITFOR DELAY '00:00:05'

	DECLARE @maThoiGian int;
	BEGIN TRY
		IF NOT EXISTS(SELECT 1 FROM ThoiGianChieu WHERE ThoiGian=@thoiGian)
		BEGIN
			INSERT INTO ThoiGianChieu(ThoiGian) VALUES(@thoiGian)
			SET @maThoiGian = SCOPE_IDENTITY()
		END
		ELSE
			SELECT @maThoiGian=MaThoiGianChieu FROM ThoiGianChieu WHERE ThoiGian=@thoiGian

		INSERT INTO SuatChieu(MaPhim, MaPhongChieu, MaThoiGianChieu, NgayChieu)
		VALUES(@maPhim, @maPhong, @maThoiGian, @ngay)
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH

	PRINT N'Thêm suất chiếu thành công'
COMMIT TRAN
RETURN 1
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Cập nhật thông tin suất chiếu
-- =============================================
IF OBJECT_ID('sp_CapNhatSuatChieu', 'P') IS NOT NULL
DROP PROC sp_CapNhatSuatChieu
GO
CREATE PROCEDURE sp_CapNhatSuatChieu
	@maSuatChieu int,
	@maPhim int,
	@maPhong int,
	@thoiGian time,
	@ngay date
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM SuatChieu WHERE MaSuatChieu=@maSuatChieu)
	BEGIN
		print N'Suất chiếu ko tồn tại'
		ROLLBACK TRAN
		RETURN
	END

	IF NOT EXISTS(SELECT 1 FROM Phim WHERE MaPhim=@maPhim) OR NOT EXISTS(SELECT 1 FROM PhongChieu WHERE MaPhongChieu=@maPhong)
	BEGIN
		print N'Phim hoặc phòng chiếu ko tồn tại'
		ROLLBACK TRAN
		RETURN
	END

	DECLARE @maThoiGian int;
	BEGIN TRY
		IF NOT EXISTS(SELECT 1 FROM ThoiGianChieu WHERE ThoiGian=@thoiGian)
		BEGIN
			INSERT INTO ThoiGianChieu(ThoiGian) VALUES(@thoiGian)
			SET @maThoiGian = SCOPE_IDENTITY()
		END
		ELSE
			SELECT @maThoiGian=MaThoiGianChieu FROM ThoiGianChieu WHERE ThoiGian=@thoiGian

		WAITFOR DELAY '0:0:10'
		UPDATE SuatChieu SET MaPhim=@maPhim, MaPhongChieu=@maPhong, MaThoiGianChieu=@maThoiGian, NgayChieu=@ngay
		WHERE MaSuatChieu=@maSuatChieu
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH

	PRINT N'Cập nhật suất chiếu thành công'
COMMIT TRAN
RETURN 1
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Xóa suất chiếu
-- =============================================
IF OBJECT_ID('sp_XoaSuatChieu', 'P') IS NOT NULL
DROP PROC sp_XoaSuatChieu
GO
CREATE PROCEDURE sp_XoaSuatChieu
	@maSuatChieu int
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM SuatChieu WHERE MaSuatChieu=@maSuatChieu)
	BEGIN
		print N'Suất chiếu không tồn tại!'
		ROLLBACK TRAN
		RETURN
	END

	BEGIN TRY
		DELETE FROM SuatChieu WHERE MaSuatChieu=@maSuatChieu
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH
	PRINT N'Đã xóa suất chiếu'
COMMIT TRAN
RETURN 1
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Thêm hóa đơn
-- =============================================
IF OBJECT_ID('sp_ThemHoaDon', 'P') IS NOT NULL
DROP PROC sp_ThemHoaDon
GO
CREATE PROCEDURE sp_ThemHoaDon
	@maKH int,
	@ngayDat datetime,
	@ngayThanhToan datetime,
	@trangThai smallint
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM KhachHang WHERE MaKH=@maKH)
	BEGIN
		print N'Khách hàng không tồn tại'
		ROLLBACK TRAN
		RETURN
	END

	DECLARE @maHoaDon int
	BEGIN TRY
		INSERT INTO HoaDon(MaKH, NgayDat, NgayThanhToan, TrangThai, TongTien)
		VALUES(@maKH, @ngayDat, @ngayThanhToan, @trangThai, 0)
		SET @maHoaDon = SCOPE_IDENTITY()
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH

	PRINT N'Thêm hóa đơn thành công'
COMMIT TRAN
RETURN @maHoaDon
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Đặt vé xem phim
-- =============================================
IF OBJECT_ID('sp_DatVe', 'P') IS NOT NULL
DROP PROC sp_DatVe
GO
CREATE PROCEDURE sp_DatVe
	@maHoaDon int,
	@maSuatChieu int,
	@maLoaiVe int,
	@maChoNgoi int
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM HoaDon WHERE MaHoaDon=@maHoaDon) OR NOT EXISTS(SELECT 1 FROM SuatChieu WHERE MaSuatChieu=@maSuatChieu)
	  OR NOT EXISTS(SELECT 1 FROM LoaiVe WHERE MaLoaiVe=@maLoaiVe) OR NOT EXISTS(SELECT 1 FROM ChoNgoi WHERE MaChoNgoi=@maChoNgoi)
	BEGIN
		print N'Tham số không hợp lệ'
		ROLLBACK TRAN
		RETURN
	END

	DECLARE @ngayDat datetime, @ngayThanhToan datetime
	SELECT @ngayDat=NgayDat, @ngayThanhToan=NgayThanhToan FROM HoaDon WHERE MaHoaDon=@maHoaDon
	IF @ngayThanhToan IS NOT NULL
	BEGIN
		print N'Hóa đơn đã được thanh toán, không thể đặt thêm vé'
		ROLLBACK TRAN
		RETURN
	END

	DECLARE @tgChieu datetime = (SELECT CAST(sc.NgayChieu AS datetime)+CAST(tg.ThoiGian AS time)
		FROM SuatChieu sc JOIN ThoiGianChieu tg ON tg.MaThoiGianChieu=sc.MaThoiGianChieu
		WHERE sc.MaSuatChieu=@maSuatChieu
	)
	DECLARE @tmpNgayDat datetime = DATEADD (day , 1 , @ngayDat)
	IF (@tmpNgayDat<@tgChieu OR @ngayDat>@tgChieu)
	BEGIN
		print N'Chỉ được đặt vé trước một ngày kể từ thời gian chiếu'
		ROLLBACK TRAN
		RETURN
	END

	IF EXISTS(SELECT 1 FROM Ve WHERE MaSuatChieu=@maSuatChieu AND MaChoNgoi=@maChoNgoi)
	BEGIN
		print N'Chỗ ngồi đã được đặt'
		ROLLBACK TRAN
		RETURN
	END
	WAITFOR DELAY '0:0:05'

	DECLARE @maVe int
	BEGIN TRY
		INSERT INTO Ve(MaSuatChieu, MaLoaiVe, MaChoNgoi, MaHoaDon)
		VALUES(@maSuatChieu, @maLoaiVe, @maChoNgoi, @maHoaDon)
		SET @maVe = SCOPE_IDENTITY()
		DECLARE @tongTien int, @giaVe int

		SELECT @tongTien=TongTien FROM HoaDon WHERE MaHoaDon=@maHoaDon
		SELECT @giaVe=Gia FROM LoaiVe WHERE MaLoaiVe=@maLoaiVe

		WAITFOR DELAY '0:0:05'

		SET @tongTien=@tongTien+@giaVe
		UPDATE HoaDon SET TongTien=@tongTien WHERE MaHoaDon=@maHoaDon
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH

	PRINT N'Đặt vé thành công'
COMMIT TRAN
RETURN @maVe
END
GO

-- =============================================
-- Author:		DatNgo
-- Description: Đặt vé xem phim
-- =============================================
IF OBJECT_ID('sp_DatVe_TH1', 'P') IS NOT NULL
DROP PROC sp_DatVe_TH1
GO
CREATE PROCEDURE sp_DatVe_TH1
	@maHoaDon int,
	@maSuatChieu int,
	@maLoaiVe int,
	@maChoNgoi int
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM HoaDon WHERE MaHoaDon=@maHoaDon) OR NOT EXISTS(SELECT 1 FROM SuatChieu WHERE MaSuatChieu=@maSuatChieu)
	  OR NOT EXISTS(SELECT 1 FROM LoaiVe WHERE MaLoaiVe=@maLoaiVe) OR NOT EXISTS(SELECT 1 FROM ChoNgoi WHERE MaChoNgoi=@maChoNgoi)
	BEGIN
		print N'Tham số không hợp lệ'
		ROLLBACK TRAN
		RETURN
	END

	DECLARE @ngayDat datetime, @ngayThanhToan datetime
	SELECT @ngayDat=NgayDat, @ngayThanhToan=NgayThanhToan FROM HoaDon WHERE MaHoaDon=@maHoaDon
	IF @ngayThanhToan IS NOT NULL
	BEGIN
		print N'Hóa đơn đã được thanh toán, không thể đặt thêm vé'
		ROLLBACK TRAN
		RETURN
	END

	DECLARE @tgChieu datetime = (SELECT CAST(sc.NgayChieu AS datetime)+CAST(tg.ThoiGian AS time)
		FROM SuatChieu sc JOIN ThoiGianChieu tg ON tg.MaThoiGianChieu=sc.MaThoiGianChieu
		WHERE sc.MaSuatChieu=@maSuatChieu
	)
	DECLARE @tmpNgayDat datetime = DATEADD (day , 1 , @ngayDat)
	IF (@tmpNgayDat<@tgChieu OR @ngayDat>@tgChieu)
	BEGIN
		print N'Chỉ được đặt vé trước một ngày kể từ thời gian chiếu'
		ROLLBACK TRAN
		RETURN
	END

	IF EXISTS(SELECT 1 FROM Ve WHERE MaSuatChieu=@maSuatChieu AND MaChoNgoi=@maChoNgoi)
	BEGIN
		print N'Chỗ ngồi đã được đặt'
		ROLLBACK TRAN
		RETURN
	END
	WAITFOR DELAY '0:0:05'

	DECLARE @maVe int
	BEGIN TRY
		INSERT INTO Ve(MaSuatChieu, MaLoaiVe, MaChoNgoi, MaHoaDon)
		VALUES(@maSuatChieu, @maLoaiVe, @maChoNgoi, @maHoaDon)
		SET @maVe = SCOPE_IDENTITY()
		DECLARE @tongTien int, @giaVe int

		SELECT @tongTien=TongTien FROM HoaDon WHERE MaHoaDon=@maHoaDon
		SELECT @giaVe=Gia FROM LoaiVe WHERE MaLoaiVe=@maLoaiVe

		WAITFOR DELAY '0:0:05'

		SET @tongTien=@tongTien+@giaVe
		UPDATE HoaDon SET TongTien=@tongTien WHERE MaHoaDon=@maHoaDon
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH

	PRINT N'Đặt vé thành công'
COMMIT TRAN
RETURN @maVe
END
GO


-- =============================================
-- Author:		DatNgo
-- Description: Hủy vé
-- =============================================
IF OBJECT_ID('sp_HuyVe', 'P') IS NOT NULL
DROP PROC sp_HuyVe
GO
CREATE PROCEDURE sp_HuyVe
	@maVe int
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM Ve WHERE MaVe=@maVe)
	BEGIN
		print N'Vé không tồn tại'
		ROLLBACK TRAN
		RETURN
	END
	WAITFOR DELAY '0:0:05'

	BEGIN TRY
		DECLARE @maHoaDon int, @maLoaiVe int, @ngayThanhToan datetime, @tongTien int, @giaVe int;
		SELECT @maHoaDon=MaHoaDon, @maLoaiVe=MaLoaiVe FROM Ve WHERE MaVe=@maVe
		SELECT @ngayThanhToan=NgayThanhToan FROM HoaDon WHERE MaHoaDon=@maHoaDon

		IF @ngayThanhToan IS NOT NULL
		BEGIN
			print N'Hóa đơn đã được thanh toán, không thể hủy vé'
			ROLLBACK TRAN
			RETURN
		END
		SELECT @tongTien=TongTien FROM HoaDon WHERE MaHoaDon=@maHoaDon
		SELECT @giaVe=Gia FROM LoaiVe WHERE MaLoaiVe=@maLoaiVe

		WAITFOR DELAY '0:0:05'

		SET @tongTien=@tongTien-@giaVe
		UPDATE HoaDon SET TongTien=@tongTien WHERE MaHoaDon=@maHoaDon

		DELETE FROM Ve WHERE MaVe=@maVe
	END TRY
	BEGIN CATCH
		DECLARE @errMsg NVARCHAR(2000)
		SELECT @errMsg = N'Error: ' + ERROR_MESSAGE()
		RAISERROR(@errMsg, 16,1)
		ROLLBACK TRAN
		RETURN
	END CATCH

	PRINT N'Hủy vé thành công'
COMMIT TRAN
RETURN 1
END
GO


-- =============================================
-- Author:		DatNgo
-- Description: Hủy Hóa Đơn
-- =============================================
IF OBJECT_ID('sp_HuyHoaDon', 'P') IS NOT NULL
DROP PROC sp_HuyHoaDon
GO
CREATE PROCEDURE sp_HuyHoaDon
	@maHoaDon int
AS
BEGIN
BEGIN TRAN
	IF NOT EXISTS(SELECT 1 FROM HoaDon WHERE MaHoaDon=@maHoaDon)
	BEGIN
		print N'Hóa đơn không tồn tại'
		ROLLBACK TRAN
		RETURN
	END
	DECLARE @ngayThanhToan datetime
	SELECT @ngayThanhToan=NgayThanhToan FROM HoaDon WHERE MaHoaDon=@maHoaDon
	IF @ngayThanhToan IS NOT NULL
	BEGIN
		print N'Hóa đơn đã được thanh toán, không thể hủy'
		ROLLBACK TRAN
		RETURN
	END

	DELETE FROM Ve WHERE MaHoaDon=@maHoaDon
	DELETE FROM HoaDon WHERE MaHoaDon=@maHoaDon

	PRINT N'Hủy hóa đơn thành công'
COMMIT TRAN
RETURN 1
END
GO